
/* 
随机程序生成基本思路:

1. 使用c嵌汇编格式的方式进行指令编写, 通过模板的方式添加汇编
2. 结果对比,使用不同的优化级别 O0, O1, O3 三种计算结果进行互校验,如果不同则错误

接下来需要做的事情就是,构造测试生成框架模板

存在的问题: 并不能完全测试出固定结果错误情况, 想对于指令算法设计错误, 这种结果检查基本失效, 即还需要一个指令计算模型(模拟器)
 */

typedef int uint32_t;
// int ac = 333;

void case1(int a3) {
    int a = 0x21f22341;
    // volatile int d;
    uint32_t c[10] = {13, 1, 3, 4, 5,1, 3, 5};
    uint32_t d;
    uint32_t* e = &c;
    for(int i=0; i<10; i++) {
        asm volatile("add %[d], %[r1], %[r2]": [d]"=r"(c[i]): [r1]"r"(d), [r2]"r"(c[i]));
        asm volatile("add %[d], %[r1], %[r2]": [d]"=r"(c[i]): [r1]"r"(d), [r2]"r"(c[i-1]));
        asm volatile("add %[d], %[r1], %[r2]": [d]"=r"(c[i]): [r1]"r"(d), [r2]"r"(c[i-1]));
        asm volatile("add %[d], %[r1], %[r2]": [d]"=r"(c[i]): [r1]"r"(d), [r2]"r"(c[i-1]));
        // asm volatile("mov %[d], %[r1]" :[d]"=r"(d):[r1] "r"(a));
        // asm volatile("add %[d], %[r1]" :[d]"=r"(d):[r1] "r"(&a));
        // asm volatile("add %[d], %[r1]" :[d]"=r"(d):[r1] "rm"(a));
        // asm volatile("add %[d], %[r1], %[r2]": [d]"=r"(c[i]): [r1]"r"(d), [r2]"r"(d));
        // asm volatile("add %[d], %[r1]" :[d]"=r"(d):[r1] "r"(c[i]));
    }
}
void main()
{
    int a = 0x21f22341;
    // volatile int d;
    uint32_t c = 13;
    uint32_t d;
    uint32_t* e = &c;
    case1(33);
    case1(33);
    for(int i=0; i<10; i++) {
        asm volatile("mov %[d], %[r1]" :[d]"=r"(d):[r1] "r"(a));
        asm volatile("mov %[d], %[r1]" :[d]"=r"(d):[r1] "r"(&a));
        asm volatile("mov %[d], %[r1]" :[d]"=r"(d):[r1] "rm"(a));
        asm volatile("add %[d], %[r1], %[r2]": [d]"=r"(c): [r1]"r"(d), [r2]"r"(d): "x1", "x4", "x8");
        asm volatile("mov %[d], %[r1]" :[d]"=r"(d):[r1] "r"(c));
    }
    // asm volatile("mov %[e], %[d]"
    //              : [ d ] "=rm"(d)
    //              : [ e ] "rm"(*e));
}
